#ifndef EDGE_DETECTOR_H
#define EDGE_DETECTOR_H

#include <opencv2/opencv.hpp>
#include <string>

/**
 * @class EdgeDetector
 * @brief 提供多种边缘检测方法（Canny、Sobel、Laplacian）的工具类
 */
class EdgeDetector {
public:
    /**
     * @brief 使用 Canny 算法进行边缘检测
     * @param src 输入图像（支持灰度图或彩色图）
     * @param threshold1 第一个阈值（低阈值）
     * @param threshold2 第二个阈值（高阈值）
     * @param apertureSize Sobel 算子的大小（默认 3）
     * @param L2gradient 是否使用更精确的梯度计算方式
     * @return 检测后的二值化边缘图
     */
    static cv::Mat CannyDetect(const cv::Mat& src,
                               double threshold1 = 100,
                               double threshold2 = 200,
                               int apertureSize = 3,
                               bool L2gradient = false);

    /**
     * @brief 使用 Sobel 算法进行边缘检测
     * @param src 输入图像（支持灰度图或彩色图）
     * @param dx x 方向上的导数阶数（常用 1）
     * @param dy y 方向上的导数阶数（常用 1）
     * @param ksize Sobel 算子的大小（1, 3, 5, 7...）
     * @param scale 计算结果的缩放因子
     * @param delta 偏移量
     * @return 检测后的边缘图
     */
    static cv::Mat SobelDetect(const cv::Mat& src,
                               int dx = 1,
                               int dy = 0,
                               int ksize = 3,
                               double scale = 1.0,
                               double delta = 0.0);

    /**
     * @brief 使用 Laplacian 算法进行边缘检测
     * @param src 输入图像（支持灰度图或彩色图）
     * @param ksize Laplacian 算子的大小（常用 1, 3, 5...）
     * @param scale 计算结果的缩放因子
     * @param delta 偏移量
     * @return 检测后的边缘图
     */
    static cv::Mat LaplacianDetect(const cv::Mat& src,
                                   int ksize = 3,
                                   double scale = 1.0,
                                   double delta = 0.0);

private:
    /**
     * @brief 检查输入图像是否有效
     * @param src 输入图像
     * @return true：有效；false：无效
     */
    static bool IsValidImage(const cv::Mat& src);
};

#endif // EDGE_DETECTOR_H
